package main

import (
	"fmt"
	"go_data_structures_and_algorithms/tool"
)

/*
1.找到链表的中间节点，若为偶数，返回上中点
2.找到链表的中间节点，若为偶数，找ceil， 即向上取整，大于中间分界线的数
3.找到链表的中间节点前一个节点，若为偶数，找floor， 即向下取整，小于中间节点的数
4.找到链表的中间节点前一个节点，若为偶数，找ceil， 即向上取整，大于中间节点的数
*/
func main() {

	node1 := tool.ListNode{
		1,
		nil,
	}
	node2 := tool.ListNode{
		2,
		nil,
	}
	node3 := tool.ListNode{
		3,
		nil,
	}
	node4 := tool.ListNode{
		4,
		nil,
	}
	node5 := tool.ListNode{
		5,
		nil,
	}
	//node6 := tool.ListNode{
	//	6,
	//	nil,
	//}
	node1.Next = &node2
	node2.Next = &node3
	node3.Next = &node4
	node4.Next = &node5
	//node5.Next = &node6
	one := questionThree(&node1)
	fmt.Println(one.Val)

}

// 找到链表的中间节点，若为偶数，返回上中点
func questionOne(node *tool.ListNode) *tool.ListNode {
	if node == nil || node.Next == nil {
		return nil
	}

	var slowPoint *tool.ListNode = node
	var QuickPoint *tool.ListNode = node

	//如果这个循环一直能进行下去说明链表一直是偶数的，如果停止了之后在判断一下next有没有值就好了
	for QuickPoint.Next != nil && QuickPoint.Next.Next != nil {

		slowPoint = slowPoint.Next
		QuickPoint = QuickPoint.Next.Next
	}

	return slowPoint
}

func questionTwo(node *tool.ListNode) *tool.ListNode {
	if node == nil || node.Next == nil {
		return nil
	}

	var slowPoint *tool.ListNode = node
	var QuickPoint *tool.ListNode = node
	//如果这个循环一直能进行下去说明链表一直是偶数的，如果停止了之后在判断一下next有没有值就好了
	for QuickPoint.Next != nil && QuickPoint.Next.Next != nil {

		slowPoint = slowPoint.Next
		QuickPoint = QuickPoint.Next.Next
	}

	slowPoint = slowPoint.Next
	return slowPoint
}
func questionThree(node *tool.ListNode) *tool.ListNode {
	if node == nil || node.Next == nil {
		return nil
	}

	var slowPoint *tool.ListNode = node
	var QuickPoint *tool.ListNode = node
	if QuickPoint.Next != nil && QuickPoint.Next.Next != nil {

		QuickPoint = QuickPoint.Next.Next
	}

	//如果这个循环一直能进行下去说明链表一直是偶数的，如果停止了之后在判断一下next有没有值就好了
	for QuickPoint.Next != nil && QuickPoint.Next.Next != nil {

		slowPoint = slowPoint.Next
		QuickPoint = QuickPoint.Next.Next
	}

	return slowPoint
}

// 4.找到链表的中间节点前一个节点，若为偶数，找ceil， 即向上取整，大于中间节点的数
func questionFour(node *tool.ListNode) *tool.ListNode {
	if node == nil || node.Next == nil {
		return nil
	}
	number := 1
	var slowPoint *tool.ListNode = node
	var QuickPoint *tool.ListNode = node
	if QuickPoint.Next != nil && QuickPoint.Next.Next != nil {

		QuickPoint = QuickPoint.Next.Next
		number++
		number++
	}

	//如果这个循环一直能进行下去说明链表一直是偶数的，如果停止了之后在判断一下next有没有值就好了
	for QuickPoint.Next != nil && QuickPoint.Next.Next != nil {

		slowPoint = slowPoint.Next
		QuickPoint = QuickPoint.Next.Next
		number++
		number++
	}
	if QuickPoint.Next != nil {
		number++
	}
	if number%2 == 0 {
		slowPoint = slowPoint.Next
	}
	return slowPoint
}
